perm filename FILES.SAI[PUB,TES]2 blob sn#146884 filedate 1975-02-19 generic text, type T, neo UTF8
00100	BEGOF("FILES")
00200	
00300	COMMENT
00400	
00500	      *** Variations at Different Sites for Most Procedures ***
00600	*** NB *** UNCVFIL NEEDS CASES FOR CMU AND ITS ****
00700	
00800	Processing of input file names and opening of input files is
00900	installation-dependent.  Most of the options are handled by a single
01000	routine called OPENTOREAD.
01100	
01200	Output file opening is simpler and handled by WRITEON.
01300	;
01400	
01500	IFC TENEX THENC
01600	DEFINE CHANGE(A,B)= [IF NULSTR(A) AND FULSTR(B) THEN B ELSE 0];
01700	ELSEC
01800	DEFINE CHANGE(A,B)= [IF A=0 THEN B ELSE 0];
01900	ENDC
02000	
02100	PROCEDURES
     

00100	PUBLIC SIMPLE PROCEDURE FILES! ;$"#
00200	BEGIN "FILES!"
00300	THISFILE ← "(NO FILE)" ;
00400	MAINFILE ← INFILE ;
00500	END "FILES!" ;
     

00100	PUBLIC SIMPLE PROCEDURE FINIFILES ;$"#
00200	BEGIN "FINIFILES"
00300	IF GENREXT THEN OUTFILE ← OUTFILE &
00400	    IFC CMUVER THENC (IF ABS(DEVICE)=XGP THEN ".XGO" ELSE ".DOC") ENDC
00500	    IFC SAILVER THENC (IF ABS(DEVICE)=XGP THEN ".XGP" ELSE ".DOC") ENDC
00600	    IFCR PARCVER THENC PARCEXT ENDC
00700	    IFC ISIVER THENC (IF ABS(DEVICE)=XGP THEN ".XGO" ELSE ".DOC") ENDC	RT01 10/25/74;
00800	    IFC ITSVER THENC DOCEXT ENDC;	PJ 5/27/74;
00900	END "FINIFILES" ;
     

00100	IFSITE TENEX THENK
00200	PRIVATE SITE(TENEX) STRING SIMPLE PROCEDURE CVFIL(STRING FILENAME; REFERENCE STRING EXT, PPN) ;$"#
00300		BEGIN
00400		STRING NAME ;
00500		PPN ← IF FILENAME[1 FOR 1] = "<" THEN SCANTO(">", FILENAME, TRUE) ELSE NULL ;
00600		NAME ← SCANTO(".;", FILENAME, FALSE) ;
00700		EXT ← IF FILENAME[1 FOR 1] = "." THEN SCANTO(";", FILENAME, FALSE) ELSE NULL ;
00800		RETURN(NAME) ;
00900		END ;
01000	ENDC
     

00100	IFSITE  CMUVER THENK
00200	PRIVATE SITE(CMUVER) STRING SIMPLE PROCEDURE CVPPN(INTEGER VALUE) ;$"#
00300	BEGIN "CVPPN"
00400	OWN SAFE INTEGER ARRAY A[0:1];
00500	INTEGER ERRSW;
00600	STRING S;
00700	DEFINE CALLI="'47000000000",	DECCMU="-3";
00800	
00900	IF VALUE = 0 THEN RETURN (NULL);
01000	
01100	A[0]←A[1]←0;
01200	START!CODE
01300	    SETZM 0,ERRSW;
01400	    MOVE 1,A;
01500	    HRLI 1,VALUE;
01600	    CALLI 1,DECCMU;
01700	    SETOM 0,ERRSW;
01800	END;
01900	
02000	RETURN ("["&
02100		(  IF ERRSW THEN (CVOS(VALUE LSH -18)&","&CVOS(VALUE LAND '777777))
02200			    ELSE (CVSTR(A[0])&CVSTR(A[1])[1 FOR 3])  )
02300		& "]");
02400	
02500	END "CVPPN";
02600	ENDC
     

00100	PUBLIC INTEGER PROCEDURE OPENTOREAD(INTEGER MODE ;
00200		STRING FILEKIND ; REFERENCE STRING FILENAME;
00300		IFC TENEX THENC STRING ELSEC INTEGER ENDC EXTDEFAULT, PPNDEFAULT) ;$"#
00400	BEGIN TES 8/24/74 PROCEDURIZED ;
00500	label labeltogetaroundcompilerbug;
00600	INTEGER CHAN, C ; BOOLEAN GOTIT ;
00700	IFC TENEX THENC STRING ELSEC INTEGER ENDC  FEXT, FPPN, EXTD, PPNI, PPND, NAME, EXT, PPN ;
00800	STRING NF ;
00900	STRING INDEVICE ;	RKJ: 5-17-74 ;
01000	SETBREAK(LOCAL!TABLE,":",NULL,"IS");
01100	INDEVICE←SCAN(INFILE,LOCAL!TABLE,DUMMY);
01200	IF NULSTR(INFILE) THEN BEGIN INFILE←INDEVICE; INDEVICE←"DSK" END ;
01300	IF (CHAN←GETCHAN)<0 THEN EARLYWARNING("NO CHANNELS ARE LEFT FOR INPUT!") ;
01400	EOF ← 0 ;
01500	OPEN(CHAN,INDEVICE,MODE, 2,0,150,BRC,EOF);
01600	GOTIT ← FALSE ;
01700	DO  BEGIN "NAMELOOP"
01800		NAME ← CVFIL(FILENAME, FEXT, FPPN) ;
01900		FOR C ← 0 THRU 5 DO
02000		    BEGIN
02100		    EXT ← FEXT ; PPN ← FPPN ;
02200		    CASE C OF
02300		        BEGIN "LKPCASES"
02400		    	BEGIN END ;
02500		    	IF (EXTD←EXT←CHANGE(FEXT, EXTDEFAULT)) = 0 THEN CONTINUE ;
02600		    	IF (PPNI←PPN←CHANGE(FPPN, INPPN)) = 0 THEN CONTINUE ;
02700		    	IF (EXT←EXTD) = 0 OR (PPN←PPNI) = 0 THEN CONTINUE ;
02800		    	IF (PPND←PPN←CHANGE(FPPN, PPNDEFAULT)) = 0 THEN CONTINUE ;
02900		    	IF (EXT←EXTD)=0 OR (PPN←PPND)=0 THEN CONTINUE ;
03000		        END "LKPCASES" ;
03100		    GOTIT ← XLOOKUP(CHAN,NAME,EXT,0,PPN);
03200		    IF GOTIT THEN DONE ;
03300		    END ;
03400		IF GOTIT THEN DONE ;
03500		IFC PARCVER THENC  TES 10/21/74 SO FONT 2 "SERIF" WORKS ;
03600		IF FILEKIND[1 TO 4] = "Font" AND FULSTR(NF←FONTEQUIV(NAME)) THEN
03700			FILENAME ← NF ELSE
03800		ENDC
03900		BEGIN
04000		IF NOT SWDBACK THEN OUTSTR(CRLF) ; SWDBACK ← TRUE ;
04100		OUTSTR(FILEKIND & FILENAME & " not found." & CRLF & "Read file: ");
04200		IFC TENEX THENC
04300			RELEASE(CHAN);
04400			OUTSTR(PPND←PPNDEFAULT) ;
04500			DO	BEGIN  TES 10/22/74 ;
04600				CHAN ← GTJFNL(PPND,'162000000000,'100000101,
04700					NULL,PPNDEFAULT[2 TO ∞-1],
04800					NAME,EXTDEFAULT[2 TO ∞],
04900					NULL, NULL, NULL) ;
05000				IF CHAN>-1 THEN DONE ;
05100				OUTSTR("XXX"&CRLF&"Read file: ") ; PPND←NULL ;
05200				END
05300			UNTIL FALSE ;
05400			SETINPUT(CHAN,150,BRC,EOF) ; TES 10/16/74 ;
05500			OPENF(CHAN, 2) ;
05600			DONE ;
05700		ELSEC
05800			FILENAME ← INCHWL ;
05900		ENDC
06000		END ;
06100	    END "NAMELOOP"
06200	UNTIL GOTIT ;
06300	labeltogetaroundcompilerbug:
06400	FILENAME ← UNCVFIL(CHAN, NAME, EXT, PPN) ;
06500	RETURN(CHAN) ;
06600	END "OPENTOREAD" ;
06700	
     

00100	IFSITE TENEX THENK TES 10/25/73 ;
00200	PRIVATE SITE(TENEX) STRING PROCEDURE SCANTO(STRING BRKS; REFERENCE STRING SCANNEE; BOOLEAN INCLUDE) ;$"#
00300		BEGIN
00400		INTEGER DUMMY ;
00500		SETBREAK(LOCAL!TABLE, BRKS, NULL, IF INCLUDE THEN "IA" ELSE "IR") ;
00600		RETURN(SCAN(SCANNEE, LOCAL!TABLE, DUMMY)) ;
00700		END ;
00800	ENDC
     

00100	IFSITE TENEX THENK
00200	PUBLIC SITE(TENEX) SIMPLE PROCEDURE SFBSZ(INTEGER CHAN, SIZE) ;$"#
00300		BEGIN "SFBSZ"
00400		INTEGER K ;
00500		DEFINE JSYS=['104000000000], SFBSZ=[JSYS '46];
00600		K ← CVJFN(CHAN) ;
00700		START!CODE "BYTE16"
00800		MOVE 1,K; MOVE 2,SIZE; SFBSZ ;
00900		END "BYTE16" ;
01000		END "SFBSZ" ;
01100	ENDC
     

00100	IFSITE TENEX THENK
00200	PUBLIC SITE(TENEX) SIMPLE STRING PROCEDURE UNCVFIL(INTEGER CHAN; STRING NAME, EXT, PPN) ;$"#
00300		RETURN(JFNS(CHAN, 0)) ;
00400	ENDC
00500	
00600	IFSITE NOT TENEX THENK
00700	PUBLIC SITE(NOT TENEX) SIMPLE STRING PROCEDURE UNCVFIL(INTEGER CHAN, NAME, EXT, PPN) ;$"#
00800	RETURN(
00900		IFC SAILVER THENC
01000			CV6STR(NAME) &
01100			(IF EXT=0 THEN NULL ELSE "." & CV6STR(EXT)[1 TO 3]) &
01200			(IF PPN=0 THEN NULL ELSE "[" & CVXSTR(PPN)[1 TO 3] &
01300				"," & CVXSTR(PPN)[4 TO 6] & "]")
01400		ENDC
01500		IFC CMUVER THENC
01600			CVXSTR(NAME) &
01700			(IF EXT=0 THEN NULL ELSE "." & CVXSTR(EXT)[1 TO 3]) &
01800			CVPPN(PPN)
01900		ENDC
02000	      ) ;
02100	ENDC
     

00100	PUBLIC INTEGER SIMPLE PROCEDURE WRITEON(BOOLEAN BINARY; STRING FILENAME) ;$"#
00200	BEGIN "WRITEON"
00300	INTEGER CH ;
00400	IF (CH ← GETCHAN) < 0 THEN
00500		BEGIN
00600		WARN("=",<"No channel for writing "&FILENAME>);
00700		RETURN(-1) ;
00800		END ;
00900	K ← 0 ; OPEN(CH, "DSK", IF BINARY THEN 8 ELSE 0, 0, 2, DUMMY, DUMMY, K) ;
01000	ENTER(CH, FILENAME, DUMMY←0) ;
01100	IF DUMMY THEN WARN("=","ENTER failed for "&FILENAME);
01200	RETURN(CH) ;
01300	END "WRITEON" ;
     

00100	IFSITE TENEX THENK
00200	PUBLIC SITE(TENEX) BOOLEAN SIMPLE PROCEDURE XLOOKUP(INTEGER CHAN; STRING NAME, EXT; INTEGER JUNK; STRING PPN) ;$"#
00300		BEGIN COMMENT RETURNS TRUE IF SUCCESSFUL ;
00400		BOOLEAN FLAG ;
00500		LOOKUP(CHAN, PPN & NAME & EXT, FLAG) ;
00600		RETURN(NOT FLAG) ;
00700		END ;
00800	ENDC
00900	
01000	IFSITE NOT TENEX THENK
01100	PUBLIC SITE(NOT TENEX) BOOLEAN SIMPLE PROCEDURE XLOOKUP(INTEGER CHAN, NAME, EXT, JUNK, PPN) ;$"#
01200	START!CODE "XLOOKUP"
01300	    MOVE 2,CHAN;
01400	    LSH 2,23;
01500	IFC ITSVER
01600	    THENC IOR 2,['027017777774] PJ 5/28/74 ;
01700	    ELSEC IOR 2,['076017777774] ENDC ; COMMENT LOOKUP 0,-4(17) ;
01800	    SETO 1,0; COMMENT TRUE ;
01900	    XCT 0,2;
02000	    SETZ 1,0; COMMENT FALSE ;
02100	END "XLOOKUP";
02200	ENDC
     

00100	FINISHED
00200	
00300	ENDOF("FILES")